package controller

import (
	"gitee.com/song-yao-shun/MQH/response"
	"gitee.com/song-yao-shun/MQH/respository"
	"gitee.com/song-yao-shun/MQH/vo"
	"github.com/gin-gonic/gin"
	"strconv"
)

//定义接口和定义增删改查的方法
type ICategoryController interface {
	RestController
}

//定义结构体
type CategoryController struct {
	Respository respository.CategoryRepository
}

func NewCategoryController() ICategoryController {
	return CategoryController{Respository:respository.NewCategoryRepository()}
}

func (c CategoryController) Create(ctx *gin.Context) {
	// 接收参数
	var requestCategory vo.CreategoryRequest
	if err := ctx.ShouldBind(&requestCategory); err != nil {
		response.Fail(ctx, nil, "数据验证错误，分类名称必填")
		return
	}

	category, err := c.Respository.Create(requestCategory.Name)
	if err != nil {
		response.Fail(ctx, nil, "新建失败！")
		return
	}

	// 返回
	response.Success(ctx, gin.H{"category":category}, "新建成功！")
}

func (c CategoryController) Update(ctx *gin.Context) {
	// 接收参数
	var requestCategory vo.CreategoryRequest
	// 使用 Bind，怎返回的数据为text，不允许重改header，返回json
	//if err := ctx.Bind(&requestCategory); err != nil {
	//	response.Fail(ctx, nil, "数据验证错误，分类名称必填")
	//	return
	//}
	if err := ctx.ShouldBind(&requestCategory); err != nil {
		response.Fail(ctx, nil, "数据验证错误，分类名称必填")
		return
	}

	// 获取 path 中的参数
	categoryId, _ := strconv.Atoi(ctx.Params.ByName("id"))

	updateCategory, err := c.Respository.SelectById(categoryId)
	if err != nil {
		response.Fail(ctx, nil, "分类不存在！")
		return
	}

	// 更新分类
	// map
	// struct
	// name value
	category, err := c.Respository.Update(*updateCategory, requestCategory.Name)
	if err != nil {
		panic(err)
	}

	response.Success(ctx, gin.H{"category":category}, "修改成功。")
}

func (c CategoryController) Show(ctx *gin.Context) {
	// 获取 path 中的参数
	categoryId, _ := strconv.Atoi(ctx.Params.ByName("id"))

	category, err := c.Respository.SelectById(categoryId)
	if err != nil {
		response.Fail(ctx, nil, "分类不存在！")
		return
	}

	response.Success(ctx, gin.H{"category":category}, "")
}

func (c CategoryController) Delete(ctx *gin.Context) {
	// 获取 path 中的参数
	categoryId, _ := strconv.Atoi(ctx.Params.ByName("id"))
	if rowsAffected := c.Respository.DeleteById(categoryId);rowsAffected != 1 {
		response.Fail(ctx, nil, "删除失败，请重试！")
		return
	}

	response.Success(ctx, nil, "删除成功！")
}

func (c CategoryController) Select(ctx *gin.Context) {
	panic("代码待补充！")
}

func (c CategoryController) List(ctx *gin.Context) {
	// 接收参数
	var requestCategoryList vo.CreategoryList

	if err := ctx.ShouldBind(&requestCategoryList); err != nil {
		response.Fail(ctx, nil, "数据验证错误，pageNum 或者 pageSize 的数据类型验证错误！")
		return
	}else{
		if requestCategoryList.PageNum == 0{
			requestCategoryList.PageNum = 1
		}
		if requestCategoryList.PageSize == 0{
			requestCategoryList.PageSize = 20
		}
	}

	categories,total := c.Respository.List(requestCategoryList.PageNum, requestCategoryList.PageSize)

	response.Success(ctx, gin.H{"data":categories, "total":total}, "查询列表成功。")
}

////定义结构体
//type CategoryController struct {
//	DB *gorm.DB
//}
//
//func NewCategoryController() ICategoryController {
//	db := common.GetDB()
//	db.AutoMigrate(model.Category{})
//
//	return CategoryController{DB:db}
//}
//
//func (c CategoryController) Create(ctx *gin.Context) {
//	// 接收参数
//	var requestCategory vo.CreategoryRequest
//	if err := ctx.ShouldBind(&requestCategory); err != nil {
//		response.Fail(ctx, nil, "数据验证错误，分类名称必填")
//		return
//	}
//
//	// 创建分类
//	// 务必重新定义模型，避免创建 requestCategory 表
//	category := model.Category{Name:requestCategory.Name}
//	if err := c.DB.Create(&category).Error; err != nil {
//		log.Printf("新增类目失败，错误信息为：%v",err)
//		response.Fail(ctx, nil, "新建失败！")
//		return
//	}
//
//	// 返回
//	response.Success(ctx, gin.H{"category":category}, "新建成功！")
//}
//
//func (c CategoryController) Update(ctx *gin.Context) {
//	// 接收参数
//	var requestCategory vo.CreategoryRequest
//	// 使用 Bind，怎返回的数据为text，不允许重改header，返回json
//	//if err := ctx.Bind(&requestCategory); err != nil {
//	//	response.Fail(ctx, nil, "数据验证错误，分类名称必填")
//	//	return
//	//}
//	if err := ctx.ShouldBind(&requestCategory); err != nil {
//		response.Fail(ctx, nil, "数据验证错误，分类名称必填")
//		return
//	}
//
//	// 获取 path 中的参数
//	categoryId, _ := strconv.Atoi(ctx.Params.ByName("id"))
//
//	var updateCategory model.Category
//	if err := c.DB.First(&updateCategory, categoryId).Error; errors.Is(err, gorm.ErrRecordNotFound){
//		response.Fail(ctx, nil, "分类不存在！")
//		return
//	}
//
//	// 更新分类
//	// map
//	// struct
//	// name value
//	// 因为每次都更新updatetime，所以不能这么判断
//	//if rowsAffected := c.DB.Model(&updateCategory).Update("name",requestCategory.Name).
//	//	RowsAffected; rowsAffected != 1 {
//	//	log.Printf("类目更新失败，更新操作影响行数为：%v",rowsAffected)
//	//}
//	c.DB.Model(&updateCategory).Update("name",requestCategory.Name)
//
//	response.Success(ctx, gin.H{"category":updateCategory}, "修改成功。")
//}
//
//func (c CategoryController) Show(ctx *gin.Context) {
//	// 获取 path 中的参数
//	categoryId, _ := strconv.Atoi(ctx.Params.ByName("id"))
//
//	var category model.Category
//	if err := c.DB.First(&category, categoryId).Error; errors.Is(err, gorm.ErrRecordNotFound){
//		response.Fail(ctx, nil, "分类不存在！")
//		return
//	}
//
//	response.Success(ctx, gin.H{"category":category}, "")
//}
//
//func (c CategoryController) Delete(ctx *gin.Context) {
//	// 获取 path 中的参数
//	categoryId, _ := strconv.Atoi(ctx.Params.ByName("id"))
//
//	if rowsAffected := c.DB.Delete(model.Category{}, categoryId).RowsAffected; rowsAffected != 1 {
//		log.Printf("类目删除失败，删除操作影响行数为：%v",rowsAffected)
//		response.Fail(ctx, nil, "删除失败，请重试！")
//		return
//	}
//
//	response.Success(ctx, nil, "删除成功！")
//}
